package Test_1116;

import java.util.Stack;

/**
 * Created with Intellij IDEA
 * Description:
 * User: 星辰
 */
class minStack {
    //建立两个栈：普通栈、最小栈
    public Stack<Integer> stack;
    public Stack<Integer> minStack;
    public minStack() {
        stack=new Stack<>();
        minStack=new Stack<>();
    }
    //将元素放入栈中
    //判断是否为空
    //如果为空，将元素放到普通栈和最小栈；
    //不为空放到普通栈中，如果放到普通栈中的元素小于最小栈，放到最小栈中
    public void push(int val) {
        if(isEmpty()){
            stack.push(val);
            minStack.push(val);
        }else{
            stack.push(val);
            if(val<=minStack.peek()){
                minStack.push(val);
            }
        }
    }
    //判断为空
    // 两个同时为空则为空
    public boolean isEmpty(){
        return stack.empty()&&minStack.empty();
    }
    //删除栈顶元素
    //判断是否为空，为空返回；
    //不为空，返回栈顶元素，判断最小栈中是否有该删除的元素，有则删除最小栈中的元素；
    public void pop() {
        if(isEmpty()){
            return;
        }

        if(stack.peek().equals(minStack.peek())){
            minStack.pop();
        }
        stack.pop();
    }
    //获取栈堆顶部元素
    //判断是否为空
    //不为空，获取栈顶元素
    public int top() {
        if(isEmpty()){
            return -1;
        }
        int val=stack.peek();
        return val;
    }
    //获取栈堆顶部元素
    //判断是否为空
    //不为空，获取栈顶元素
    public int getMin() {
        if(isEmpty()){
            return -1;
        }
        int val=minStack.peek();
        return val;
    }
}
public class Solution {
    //逆波兰表达式求值
    public int evalRPN(String[] tokens) {
        Stack<Integer> stack=new Stack<>();
        for (int i = 0; i < tokens.length; i++) {
            //看是否为符号
            //如果不是符号，将其放到栈中；
            //如果是符号，将数字取出，进行对应的计算
            String ch=tokens[i];
            if(ch.equals("+")||ch.equals("-")||ch.equals("*")||ch.equals("/")){
                int val1=stack.pop();
                int val2=stack.pop();
                //选择是那一种符号
                switch (ch){
                    case "+":
                        stack.push(val1+val2);
                    break;
                    case "-":
                        stack.push(val1-val2);
                        break;
                    case "*":
                        stack.push(val1*val2);
                        break;
                    case "/":
                        stack.push(val1/val2);
                        break;
                }
            }else{
                int num=Integer.parseInt(tokens[i]);
                stack.push(num);
            }

        }
        return stack.peek();
    }
}
